package ar.com.ctrln.view.dashboard.mantenimiento.ticket;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Div;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timer;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.mantenimiento.ticket.RegistrarTicket;
import ar.com.ctrln.control.mantenimiento.ticket.VerEditarTicket;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.insumo.Insumo;
import ar.com.ctrln.persistence.model.servicios.Servicio;
import ar.com.ctrln.persistence.model.servicios.TipoServicio;
import ar.com.ctrln.persistence.model.ticket.EstadoTicket;
import ar.com.ctrln.persistence.model.ticket.Ticket;
import ar.com.ctrln.persistence.model.ticket.TipoTicket;
import ar.com.ctrln.persistence.model.ticket.actividad.Actividad;
import ar.com.ctrln.persistence.model.ticket.actividad.DetalleActividad;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;
import ar.com.ctrln.view.render.mantenimiento.actividad.*;

@SuppressWarnings("unused")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class VerTicketController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7293861791737040132L;

	@WireVariable
	private VerEditarTicket verEditarTicket;

	private Ticket ticket;

	private EstadoTicket estadoTicket;

	private Cliente emisor;

	private EventQueue<Event> eq = EventQueues.lookup("actulizarLista",
			EventQueues.DESKTOP, true);

	private EventQueue<Event> eq1 = EventQueues.lookup("ticketsRefresh",
			EventQueues.DESKTOP, true);

	private EventQueue<Event> com = EventQueues.lookup("traerComentario",
			EventQueues.DESKTOP, true);

	private EventQueue<Event> eq2 = EventQueues.lookup("ticketsUpdate",
			EventQueues.DESKTOP, true);

	@Wire
	private Window wVerTicket;

	@Wire
	private Image iModificarAct;

	@Wire
	private Listbox lbActividades;

	@Wire
	private Label lVerEmisor;

	@Wire
	private Label lVerTipoTicket;

	@Wire
	private Label lVerServicio;

	@Wire
	private Label lVerDescripcion;

	@Wire
	private Label lVerPrioridad;

	@Wire
	private Label lFechaLimite;

	@Wire
	private Label lVerEstado;

	// /////////////POpUP/////////

	@Wire
	private Label lNombreAct;

	@Wire
	private Label lDescripcionAct;

	@Wire
	private Label lInicio;

	@Wire
	private Label lFin;

	@Wire
	private Checkbox chkCar;

	@Wire
	private Listbox lbDetActividad;

	@Wire
	private Label lCar;

	@Wire
	private Div btnCancelar;

	@Wire
	private Div btnVolver;

	@Wire
	private Popup popupExito;

	@Wire
	private Popup popup;

	@Wire
	private Popup detActividad;

	@Wire
	private Label popText;

	@Wire
	private Toolbarbutton tbCancelarTicket;

	private SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");

	private TipoServicio tipoServicio;

	private Window comentario;

	private Connection con;

	@SuppressWarnings({})
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lbActividades.setItemRenderer(new ActividadItemRender());
		long idTicket = ((Ticket) Executions.getCurrent().getArg().get("data"))
				.getId();
		ticket = verEditarTicket.getTicketxId(idTicket);
		comentario = (Window) Executions.createComponents(
				"/zul/mantenimiento/tickets/comentarioTicket.zul", null, null);
		if (!ticket.getEstado().equals(Ticket.ESTADO_PROGRAMADO)
				&& !ticket.getEstado().equals(Ticket.ESTADO_PENDIENTE)) {
			btnCancelar.setVisible(false);
			iModificarAct.setVisible(false);
		}
		lVerEmisor.setValue(ticket.getOrganizacion().getRazonSocial());
		lVerTipoTicket.setValue(ticket.getTipoTicket().getNombre());
		if (ticket.getServicio() != null) {
			lVerServicio.setValue(ticket.getServicio().getNombre());
		}
		lVerDescripcion.setValue(ticket.getDescripcion());
		lVerPrioridad.setValue(ticket.getPrioridad());
		lFechaLimite.setValue(sdf.format(ticket.getFechaLimite()));
		lVerEstado.setValue(ticket.getEstado());

		if (!ticket.getActividades().isEmpty())
			lbActividades.setModel(new ListModelList<Actividad>(ticket
					.getActividades()));

		eq.subscribe(new EventListener<Event>() {
			public void onEvent(Event event) throws Exception {
				verificarFinalizacion();
			}
		});

		com.subscribe(new EventListener<Event>() {
			public void onEvent(Event event) throws Exception {
				ticket.setConclucion((String) event.getData());
				verEditarTicket.actualizarTicket(ticket);
				btnCancelar.setVisible(false);
				Clients.showNotification(
						"Se ha notificado al cliente sobre la resolucion",
						Clients.NOTIFICATION_TYPE_INFO, null, "middle_center",
						2500);
				eq1.publish(new Event("onButtonClick", null, null));
			}
		});
	}

	public void verificarFinalizacion() {

		boolean completo = true;
		ticket = verEditarTicket.getTicketxId(ticket.getId());
		lbActividades.setModel(new ListModelList<Actividad>(ticket
				.getActividades()));
		for (Actividad act : ticket.getActividades()) {
			if (!act.getEstado().equals(Actividad.ESTADO_FINALIZADA))
				completo = false;
		}
		if (completo) {
			ticket.setEstado(Ticket.ESTADO_ENESPERA);
			comentario.setVisible(true);
			comentario.doModal();
		}
	}

	@Listen("onClick = #btnCancelar")
	public void cancelarTicket() {
		ticket.setEstado(Ticket.ESTADO_CANCELADO);
		verEditarTicket.actualizarTicket(ticket);
		eq2.publish(new Event("onButtonClick", btnCancelar, null));
		volverConsultar();
	}

	@Listen("onClick = #iModificarAct")
	public void modificarActividad() {
		if (lbActividades.getSelectedItem() != null) {
			Actividad act = lbActividades.getSelectedItem().getValue();
			Map<String, Object> args = new HashMap<String, Object>();
			args.put("actividadID", act.getId());
			args.put("ticketID", ticket.getId());
			Executions.createComponents(
					"/zul/mantenimiento/tickets/editarActividad.zul",
					wVerTicket, args);
		} else {
		}
	}

	@Listen("onClick = #btnVolver; onClose = #wVerTicket")
	public void volverConsultar() {
		com.close();
		comentario.onClose();
		// eq1.close();
		eq.close();
		// eq2.close();
		wVerTicket.onClose();
	}

	@Listen("onClick = #lbActividades")
	public void verActividad() {
		SimpleDateFormat sdf = new SimpleDateFormat("dd MMMMMMMMMM yyyy");
		lCar.setValue("");
		detActividad.open(detActividad, "at_pointer");
		Actividad activ = lbActividades.getSelectedItem().getValue();
		lNombreAct.setValue(activ.getNombre());
		lDescripcionAct.setValue(activ.getDescripcion());
		lInicio.setValue(sdf.format(activ.getFechaInicio()) + " "
				+ activ.getHoraInicio());
		lFin.setValue(activ.getFechaFin() + " " + activ.getHoraFin());
		chkCar.setChecked(activ.getVehiculo() != null);
		if (activ.getVehiculo() != null)
			lCar.setValue(activ.getVehiculo().getNombre());
		lbDetActividad.setItemRenderer(new DetActividadItemRender());
		if (activ.getDetalles() != null)
			lbDetActividad.setModel(new ListModelList<DetalleActividad>(activ
					.getDetalles()));
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Listen("onClick = #btnImprimir")
	public void generarReporte() throws SQLException {
		SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");
		try {
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/ctrln", "root", "root");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		String path = this.getPage().getDesktop().getWebApp()
				.getRealPath("/resources/reportes/FormaTicketCliente.jrxml");
		String camino = path.replaceAll("\\\\", "/");

		try {
			Map param = new HashMap();
			param.put("razonSocial", ticket.getOrganizacion().getRazonSocial());
			param.put("cuit", ticket.getOrganizacion().getCuit_cuil());
			param.put("localidad", ticket.getOrganizacion().getDireccion()
					.getLocalidad().getNombre());
			param.put("direccion", ticket.getOrganizacion().getDireccion()
					.getCalle()
					+ " " + ticket.getOrganizacion().getDireccion().getNumero());
			param.put("nroTicket", String.valueOf(ticket.getId()));
			param.put("tipo", ticket.getTipoTicket().getNombre());
			if (ticket.getServicio() == null)
				param.put("servicio", ticket.getTipoServicio().getNombre());
			else
				param.put("servicio", ticket.getServicio().getNombre());

			param.put("fechaAlta", sdf.format(ticket.getFechaAlta()));
			param.put("fechaFin", sdf.format(new Date()));
			param.put("descripcion", ticket.getDescripcion());

			JasperReport jasperReport = JasperCompileManager
					.compileReport(camino);
			JasperPrint jasperPrint = JasperFillManager.fillReport(
					jasperReport, param, con);
			JasperViewer.viewReport(jasperPrint, false);
			con.close();
		} catch (JRException e) {
			e.printStackTrace();
		}

	}

}
